Amazon S3 Table の「メンテナンス」を設定してみた

Amazon S3 Table の「メンテナンス」を設定してみた

Clock Icon2024.12.30

こんにちは、製造ビジネステクノロジー部の若槻です。

re:Invent 2024 で、分析ワークロードに最適化された S3 ストレージをテーブル形式のデータとして提供する新サービス Amazon S3 Table が発表され、一般提供開始となりました。

この Amazon S3 Table にはテーブルの「メンテナンス」の概念があり、これによりテーブルを利用し続けるうえでのコスト削減やクエリパフォーマンスの向上を自動化することができます。

https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-maintenance-overview.html

今回はこの Amazon S3 Table のメンテナンス構成を実際に設定してみました。

やってみた

現時点では Amazon S3 Table の設定項目の管理操作の多くはマネジメントコンソールからの実施がサポートされておらず、基本的に CLI や API で実施することになります。本記事では AWS CLI を使って各種設定を行ってみます。

環境の準備

Amazon S3 Tables を利用する際には、Table Bucket(テーブルバケット)、Namespace(ネームスペース) および Table(テーブル)の 3 つの要素を作成する必要があります。まずはこれらを CLI で作成して環境準備を行います。

テーブルバケットの作成

テーブルを S3 リソースとして作成および保存するために「テーブルバケット」というタイプの S3 バケットを作成します。バケット名は通常の S3 バケットとは異なりグローバルで一意である必要はなく、アカウントおよびリージョン内で一意でさえあればよいです。

REGION=us-east-1
BUCKET_NAME=wakatsuki-20241230

aws s3tables create-table-bucket \
    --region ${REGION} \
    --name ${BUCKET_NAME}
参考

https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-buckets-create.html

ネームスペースの作成

テーブルバケット配下に「ネームスペース」という論理グループを作成します。テーブルはネームスペース内でグループ化されます。

NAME_SPACE=example_namespace
TABLE_BUCKET_ARN=arn:aws:s3tables:${REGION}:${ACCOUNT}:bucket/${BUCKET_NAME}

aws s3tables create-namespace \
    --table-bucket-arn ${TABLE_BUCKET_ARN} \
    --namespace ${NAME_SPACE} \
    --region ${REGION}
参考

https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-namespace-create.html

テーブルの作成

最後に「テーブル」をネームスペース配下に作成します。テーブルにテーブルデータと関連メタデータで構成される構造化データセットが保存されます。なお format で指定可能なのは現時点では ICEBERG (Apache Iceberg 形式) のみとなっています。

TABLE_NAME=example_table

aws s3tables create-table \
    --table-bucket-arn ${TABLE_BUCKET_ARN} \
    --namespace ${NAME_SPACE} \
    --name ${TABLE_NAME} \
    --format ICEBERG \
    --region ${REGION}

コマンド実行後にマネジメントコンソールからもテーブルバケット内にテーブルが作成されていることを確認できました。

参考

https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-create.html

メンテナンスジョブのステータス確認

メンテナンスはジョブにより自動化されており、そのステータスは aws s3tables get-table-maintenance-job-status コマンドで確認できます。

$ aws s3tables get-table-maintenance-job-status \
    --table-bucket-arn ${TABLE_BUCKET_ARN} \
    --namespace ${NAME_SPACE} \
    --name ${TABLE_NAME} \
    --region ${REGION}

{
    "tableARN": "arn:aws:s3tables:us-east-1:XXXXXXXXXXXX:bucket/wakatsuki-20241230/table/0e4b2dad-b269-47be-9c39-2ed348ed1896",
    "status": {
        "icebergCompaction": {
            "status": "Not_Yet_Run"
        },
        "icebergSnapshotManagement": {
            "status": "Not_Yet_Run"
        },
        "icebergUnreferencedFileRemoval": {
            "status": "Not_Yet_Run"
        }
    }
}

テーブル作成直後はまだどのジョブも実行されておらず、Not_Yet_Run となっています。ジョブには以下の種類のステータスがあります。

  • Successful:成功
  • Failed:失敗
  • Disabled:無効
  • Not_Yet_Run:未実行

またメンテナンス項目は以下のものがあります。これらをジョブとして自動実行するによりコストの削減やパフォーマンスの向上が図られます。

  • icebergCompaction:Iceberg 形式ファイルの圧縮
  • icebergSnapshotManagement:Iceberg スナップショット管理
  • icebergUnreferencedFileRemoval:Iceberg 形式ファイルの参照されていないファイルの削除

また後述のメンテナンス構成の取得結果の通り、既定ではすべてのメンテンス項目が有効となっています。

参考

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3tables/get-table-maintenance-job-status.html

メンテナンス構成の取得、更新(テーブルバケットレベル)

メンテナンス構成にはテーブルバケットレベルとテーブルレベルの 2 つの設定があります。

テーブルバケットレベルの設定は icebergUnreferencedFileRemoval(Iceberg 形式ファイルの参照されていないファイルの削除設定)となり、aws s3tables get-table-bucket-maintenance-configuration コマンドで取得できます。

$ aws s3tables get-table-bucket-maintenance-configuration \
    --table-bucket-arn ${TABLE_BUCKET_ARN} \
    --region ${REGION}

{
    "tableBucketARN": "arn:aws:s3tables:us-east-1:XXXXXXXXXXXX:bucket/wakatsuki-20241230",
    "configuration": {
        "icebergUnreferencedFileRemoval": {
            "status": "enabled",
            "settings": {
                "icebergUnreferencedFileRemoval": {
                    "unreferencedDays": 3,
                    "nonCurrentDays": 10
                }
            }
        }
    }
}

既定では 3 日間未参照 (unreferencedDays) であれば非カレントとなり、10 日間非カレント (nonCurrentDays) であれば削除される設定となっています。

テーブルバケットレベルのメンテナンス構成の設定更新は aws s3tables put-table-bucket-maintenance-configuration コマンドで行います。

$ aws s3tables put-table-bucket-maintenance-configuration \
    --table-bucket-arn ${TABLE_BUCKET_ARN} \
    --type icebergUnreferencedFileRemoval \
    --value='{"status":"disabled","settings":{"icebergUnreferencedFileRemoval": {"unreferencedDays":5,"nonCurrentDays":15}}}' \
    --region ${REGION}

上記の例では icebergUnreferencedFileRemoval を無効化し、未参照 5 日間、非カレント 15 日間で削除されるように設定を変更しています。設定結果を取得するとちゃんと変更が反映されていることが確認できます

$ aws s3tables get-table-bucket-maintenance-configuration \
    --table-bucket-arn ${TABLE_BUCKET_ARN} \
    --region ${REGION}
{
    "tableBucketARN": "arn:aws:s3tables:us-east-1:XXXXXXXXXXXX:bucket/wakatsuki-20241230",
    "configuration": {
        "icebergUnreferencedFileRemoval": {
            "status": "disabled",
            "settings": {
                "icebergUnreferencedFileRemoval": {
                    "unreferencedDays": 5,
                    "nonCurrentDays": 15
                }
            }
        }
    }
}

参考

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3tables/get-table-bucket-maintenance-configuration.html

メンテナンス構成の取得、更新(テーブルレベル)

テーブルレベルの設定は icebergCompaction(Iceberg 形式ファイルの圧縮設定)と icebergSnapshotManagement(Iceberg スナップショット管理設定)となり、aws s3tables get-table-maintenance-configuration コマンドで取得できます。

$ aws s3tables get-table-maintenance-configuration \
    --table-bucket-arn ${TABLE_BUCKET_ARN} \
    --namespace ${NAME_SPACE} \
    --name ${TABLE_NAME} \
    --region ${REGION}

{
    "tableARN": "arn:aws:s3tables:us-east-1:XXXXXXXXXXXX:bucket/wakatsuki-20241230/table/0e4b2dad-b269-47be-9c39-2ed348ed1896",
    "configuration": {
        "icebergCompaction": {
            "status": "enabled",
            "settings": {
                "icebergCompaction": {
                    "targetFileSizeMB": 512
                }
            }
        },
        "icebergSnapshotManagement": {
            "status": "enabled",
            "settings": {
                "icebergSnapshotManagement": {
                    "minSnapshotsToKeep": 1,
                    "maxSnapshotAgeHours": 120
                }
            }
        }
    }
}

既定では icebergCompaction に基づきファイルあたり 512 MB となるように圧縮され、icebergSnapshotManagement に基づき最低 1 つのスナップショットを保持し、スナップショットの最大保持期間は 120 時間となっています。

テーブルレベルのメンテナンス構成の設定更新は aws s3tables put-table-maintenance-configuration コマンドで行います。

$ aws s3tables put-table-maintenance-configuration \
    --table-bucket-arn ${TABLE_BUCKET_ARN} \
    --type icebergCompaction \
    --namespace ${NAME_SPACE} \
    --name ${TABLE_NAME} \
    --value='{"status":"disabled","settings":{"icebergCompaction": {"targetFileSizeMB":256}}}' \
    --region ${REGION}

上記の例では icebergCompaction を無効化し、ファイルあたり 256 MB となるように設定を変更しています。設定結果を取得するとちゃんと変更が反映されていることが確認できます。

$ aws s3tables get-table-maintenance-configuration \
    --table-bucket-arn ${TABLE_BUCKET_ARN} \
    --namespace ${NAME_SPACE} \
    --name ${TABLE_NAME} \
    --region ${REGION}
{
    "tableARN": "arn:aws:s3tables:us-east-1:XXXXXXXXXXXX:bucket/wakatsuki-20241230/table/0e4b2dad-b269-47be-9c39-2ed348ed1896",
    "configuration": {
        "icebergCompaction": {
            "status": "disabled",
            "settings": {
                "icebergCompaction": {
                    "targetFileSizeMB": 256
                }
            }
        },
        "icebergSnapshotManagement": {
            "status": "enabled",
            "settings": {
                "icebergSnapshotManagement": {
                    "minSnapshotsToKeep": 1,
                    "maxSnapshotAgeHours": 120
                }
            }
        }
    }
}

value の指定に誤りがある場合は次のようなエラーになります。下記では JSON 構造の settingstargetFileSizeMB が指定されているが、icebergCompaction または icebergSnapshotManagement のいずれかである必要があるというエラーです。

$ aws s3tables put-table-maintenance-configuration \
    --table-bucket-arn ${TABLE_BUCKET_ARN} \
    --type icebergCompaction \
    --namespace ${NAME_SPACE} \
    --name ${TABLE_NAME} \
    --value='{"status":"disabled","settings":{"targetFileSizeMB":512}}' \
    --region ${REGION}

Parameter validation failed:
Unknown parameter in value.settings: "targetFileSizeMB", must be one of: icebergCompaction, icebergSnapshotManagement

参考

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3tables/get-table-maintenance-configuration.html
https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3tables/put-table-maintenance-configuration.html

おわりに

Amazon S3 Table のメンテナンス構成を AWS CLI で設定してみました。これにより、テーブルのメンテナンスを自動化することでコスト削減やパフォーマンス向上を図ることができます。組織やシステムのポリシーに基づいて適切に設定を行い、効果的に活用していきましょう。

以上

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.